<css>视口概念
视口
像素(pixel)
- 设备像素:任何屏幕的物理像素数量是固定的
- CSS像素:CSS抽象的
布局视口
- 概念
- CSS中,被称为初始包含块,是所有CSS百分比宽度推算的根源。
- PC浏览器布局视口的宽度与浏览器的宽度相同。
- 移动端浏览器,布局视口与浏览器屏幕宽度不再相互关联,完全独立。
- js获取方式
- document.documentElement.clientWidth
- document.documentElement.clientWidth
视觉视口
- 概念
- 用户正在看到的网站区域,用户可以通过缩放操作视觉视口,同时不会影响布局视口,布局视口仍会保持原来的宽度。
- 移动端视觉视口与设备屏幕一样宽,并且它表示的CSS像素数量会根据缩放改变。
- js获取方式
- window.innerWidth
- window.innerHeight
理想视口
- 概念
- 移动设备上,布局视口的默认宽度不是一个理想的宽度,因此引进理想视口。
- 当网站是移动设备使用时理想视口才会生效(meta标签生效)。
- 设置布局视口宽度与理想视口宽度一致。
- 浏览器厂商决定理想视口。
1 | <meta name="device" content="width=device-width"> |
- js获取方式
- screen.width/height 存在严重的兼容性问题,也可能返回浏览器设备像素尺寸。
视口之间的关系
- 桌面浏览器,浏览器窗口就是布局视口。
- 手机上,布局视口限制CSS布局,视觉视口决定用户看到的内容。
- 理想视口是移动浏览器布局的一个理想尺寸,可以把布局视口尺寸设置为理想视口尺寸,实现响应式布局。
缩放
- 缩放行为在手机和桌面上区别很大。
- 桌面上:
- 行为一般是一次性的。
- 布局视口会被缩放影响,因为桌面布局视口与视觉视口相同。
- 移动设备上
- 缩放是一个交互过程
- 布局视口不会被缩放影响。
- 移动端缩放不会导致CSS布局被重新计算。
- 移动端浏览器根据理想视口的大小来计算缩放程度。
- 拖放
- 禁止缩放
1 | <meta name="viewport" content="user-scalable=no"> |
分辨率
物理分辨率
- 物理分辨率 = 像素数量 / 英寸单位宽度
- 简称DPI
- 每英寸像素数量越多显示越清晰
- 有些手机可以动过screen.width获取,但是有兼容性问题
- 96dpi = 1dppx
1 | //css使用需要加单位 |
设备像素比
- 设备像素比 = 设备像素个数 / 理想视口
- 简称DPR(Device Pixel Ratio)
- js属性window.devicePixelRatio
- CSS device-pixel-ratio(基于webkit浏览器)和分辨率的媒体查询。
- 浏览器厂商决定理想视口,因此DPR也由他们决定。
- 单位dppx但是使用时不需要添加。
- 96dpi = 1dppx
1 | //js使用 |
meta
- width:设置布局视口宽度为特定值。
- initial-scale:设置页面初始缩放程度和布局视口的宽度。
- minimum-scale\maximum-scale设置用户最小最大可缩放程度。
- user-scalable:是否阻止缩放。
- 将布局视口设置为设备理想视口
1 | <meta name="viewport" content="width=device-width"> |
- initial-scale
- 缩放程度根据理想视口计算。
- initial-scale=1时,视觉视口和理想视口尺寸一样。
- initial-scale=2时,会放大到200%,此时视觉视口的宽高是理想视口的一半。
- 使用initial-scale,同时会将布局视口的尺寸设置为缩放后的尺寸。
- initial-scale与width=decice-width效果一样。
1 | <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> |
媒体查询
- 语法
- 媒介类型:media_type: all | aural | braille | handheld | print | projection | screen | tty | tv | embossed
- and
1 | @media tv and (min-width: 700px) and (orientation: landscape) { } |
- or:使用逗号分隔效果等同于or逻辑操作符
1 | @media (min-width: 700px), handheld and (orientation: landscape) {} |
- not:not关键字仅能应用于整个查询,而不能单独应用于一个独立的查询
1 | //例如 |
1 | @media not screen and (color), print and (color) |
媒体查询三种类型:
- 媒介查询,是什么类型的设备
1 | @media print{ |
- 视口相关查询
1 | //布局视口宽度小于等于400px时生效 |
1 | //布局视口不超过400px,设备处于横屏,并且devicePixelRatio小于1.5时生效 |
- 特性相关查询,浏览器是否支持某些特性
1 | @supports ( display: flex ) { |